package com.my.ecommercesystem.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.my.ecommercesystem.dao.GoodsDao;
import com.my.ecommercesystem.dao.ShopCartDao;
import com.my.ecommercesystem.dto.CartDto;
import com.my.ecommercesystem.entity.Goods;
import com.my.ecommercesystem.service.ShopCartService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

@Service

public class ShopCartServiceImpl implements ShopCartService {
    @Autowired
    private ShopCartDao shopCartDao;

    @Resource
    private GoodsDao goodsDao;

    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public List<CartDto> queryShopCartByUserId(Integer id) {
       List<CartDto> list = shopCartDao.queryShopCartByUserId(id);
       return list;
    }

    @Override
    public boolean addShopCart(CartDto shopCartDto) {
        if (shopCartDao.addShopCart(shopCartDto)){
            return true;
        }
        return false;
    }


    @Override
    public Integer queryShopCartCount(Integer id) {
        return shopCartDao.queryShopCartCount(id);
    }

    @Override
    public Page<CartDto> queryAllShopCart(Integer id, Integer page, Integer size) throws Exception{

      /* String key = "shopcart:"+id;
        Page<ShopCartDao> cartobj = (Page<ShopCartDao>) redisTemplate.opsForValue().get(key);
        if (cartobj==null){
            synchronized (this.getClass()){
                cartobj = (Page<ShopCartDao>) redisTemplate.opsForValue().get(key);
                if (cartobj==null){
                    System.out.println("查询数据库。。。。。。。。。。。。");
                    PageHelper.startPage(page,size);
                    Page<ShopCartDao> list= (Page<ShopCartDao>) shopCartDao.queryShopCartByUserId(id);
                    return list;
                }else {
                    System.out.println("查询缓存（同步代码块）》》》》》》》》》》》》》》》");
                    return cartobj;
                }
            }
        }else {
            System.out.println("查询缓存》》》》》》》》》》》》》》》");
        }
        return cartobj;*/

        PageHelper.startPage(page,size);
        Page<CartDto> list= shopCartDao.queryShopCartByUserId(id);
        return list;

    }
/**
     * 添加商品的主要业务处理方法******
     * @param uid 用户的id
     * @param gid 商品的id
     * @param num 添加的商品数量
     * @param subtotal 添加的商品小计
     */
    @Override
    public void addToCart(Integer uid, Integer gid, Integer num, double subtotal) {

        CartDto result = queryCarByUseridAndGoodsid(1, gid);
        //判断查询结果是否为空
        if (result == null){
            // 是：表示该用户的购物车没有该商品，则需要执行insert操作
            // -- 调用queryGoodsByGoodsId方法得到商品详情，该数据中包含商品价格
            Goods goods = goodsDao.queryGoodsByGoodsId(gid);
            CartDto shopCartDto = new CartDto();
            //补全shopCart对象的属性
            shopCartDto.setUser_id(1);
            shopCartDto.setGoods_id(gid);
            shopCartDto.setGoods_number(num);
            shopCartDto.setGoods_subtotal(subtotal);
            //调用insertShopCart方法插入数据
            insertShopCart(shopCartDto);
        }else {
            // 否：表示该用户的购物车已有该商品，则需要执行update操作增加数量
            // 从查询结果中获取cid
            Integer cid = result.getCart_id();
            // 从查询结果中取出原有数量，与参数num相加，得到新的数量
            Integer allnum = result.getGoods_number() + num;
            //从查询结果中取出原有小计，与参数subtotal相乘，得到新的小计
            double allsubtotal = (result.getGoods_subtotal())*subtotal;
            //调用updateCartNumAndSubtotalByCartId方法执行修改数量
            updateCartNumAndSubtotalByCartId(cid,allnum,allsubtotal);
        }
    }

    @Override
    public Integer insertShopCart(CartDto shopCartDto) {
        Integer rows = shopCartDao.insertShopCart(shopCartDto);
        if (rows!=1){
            System.out.println("创建购物车数据失败！插入购物车数据时出现未知错误，请联系系统管理员！");
        }
        return 1;
    }

    @Override
    public Integer updateCartNumAndSubtotalByCartId(Integer cart_id, Integer goods_number, double goods_subtotal) {
        Integer rows = shopCartDao.updateCartNumAndSubtotalByCartId(cart_id, goods_number, goods_subtotal);
        if (rows!=1){
            System.out.println("创建购物车数据失败！插入购物车数据时出现未知错误，请联系系统管理员！");

        }
        return 1;
    }

    @Override
    public CartDto queryCarByUseridAndGoodsid(Integer user_id, Integer goods_id) {
        return shopCartDao.queryCarByUseridAndGoodsid(user_id, goods_id);
    }

    @Override
    public double sumCartsubtotal(Integer user_id) {
        if (user_id == null){
            return 0;
        }
        return  shopCartDao.sumCartsubtotal(user_id);
    }

    @Override
    public Integer sumCartallcount(Integer user_id) {
        if (user_id == null){
            return null;
        }
        return  shopCartDao.sumCartallcount(user_id);
    }

    @Override
    public boolean deleteShorCartByCartId(Integer cart_id) {
        return shopCartDao.deleteShorCartByCartId(cart_id);
    }

    /*    *//**
     * 插入购物车数据
     * @param shopCartDto 购物车数据
     * @return受影响的行数
     *//*
    private void insertShopCart(ShopCartDto shopCartDto){
        Integer rows = shopCartDao.insertShopCart(shopCartDto);
        if (rows!=1){
            System.out.println("创建购物车数据失败！插入购物车数据时出现未知错误，请联系系统管理员！");

        }
    }

    *//**
     * 修改购物车中商品的数量和小计
     * @param id 购物车id
     * @param num 新的数量
     * @param subtotal 新的小计
     * @return 受影响的行数
     *//*
    private void updateCartNumAndSubtotalByCartId(Integer id,Integer num,double subtotal) {
        Integer rows = shopCartDao.updateCartNumAndSubtotalByCartId(id, num, subtotal);
        if (rows!=1){
            System.out.println("创建购物车数据失败！插入购物车数据时出现未知错误，请联系系统管理员！");

        }
    }

    *//**
     * 查询某用户在购物车添加的某商品的详情
     * @param uid 用户的id
     * @param gid 商品的id
     * @return 匹配的购物车详情，如果该用户没有将该商品添加到购物车，则返回null
     *//*
    private ShopCartDto queryCarByUseridAndGoodsid(Integer uid,Integer gid) {
            return shopCartDao.queryCarByUseridAndGoodsid(1, gid);
    }*/
}
